Smart Pointer

데코레이터 디자인 패턴을 사용하면 객체의 기능을 수정/확장할 수 있다.
프록시 디자인 패턴도 객체의 기능을 수정/확장하는데 사용되지만, 기존 API의 사용 방식을 정확히 동일하게
유지하면서 내부 동작만 달리하는 디자인 패턴이다.
스마트 포인터
스마트 포인터는 포인터의 참조 횟루를 관리하고, 몇몇 연산자를 오버라이딩하는 래퍼이다.
(일반적인 포인터와 완전히 동일하게 사용(API)할 수 있도록 지원한다-포인터의 인터페이스를 유지)
struct BankAccount{
void deposit(int amount){/* ... */}
};
BankAccount *ba=new BankAccount;
ba->deposit(123);
auto ba2=make_shared<BankAccount>();
ba2->deposit(123); // SAME API with general pointer
위처럼 스마트 포인터는 포인터와 동일한 인터페이스를 지원하기 때문에
포인터가 사용될 자리에 스마트 포인터가 대신 사용도리 수 있다.